/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package xmlaufgabe4;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Schreibt an Hand der uebergebenen Daten eine neue XML Datei mit einer fest
 * definierten Struktur valide und wohlgeformt nach dem vorgegebenen Validator.
 * 
 * @author Adrian Cieluch
 */
public class XMLWriter {
    /**
     * Speichert Buecher.
     */
    private ArrayList<Book> books;
    /**
     * Speichert DVDs.
     */
    private ArrayList<DVD> dvds;
    /**
     * Speichert Tontraeger.
     */
    private ArrayList<SoundStorage> storages;
    /**
     * Speichert eBooks.
     */
    private ArrayList<EBook> eBooks;
    /**
     * Speichert den von Java vorgegebenen Befehl zum Plattform-unabhaengigen
     * Einfuegen einer neuen Zeile.
     */
    private String newLine;
    
    /**
     * Intialisiert die Attribute mit den uebergebenen Parametern.
     * 
     * @param books Buecher
     * @param dvds DVDs
     * @param soundStorages Tontraeger
     * @param ebooks eBooks
     */
    public XMLWriter(ArrayList<Book> books, ArrayList<DVD> dvds,
            ArrayList<SoundStorage> soundStorages, ArrayList<EBook> ebooks) {
        this.books = books;
        this.dvds = dvds;
        this.storages = soundStorages;
        this.eBooks = ebooks;
        this.newLine = System.getProperty("line.separator");
    }
    
    /**
     * Erstellt eine neue Datei mit dem Namen output und schreibt alle benoetigten
     * Eintraege nach einer festen Struktur in die Datei.
     * 
     * @param output Dateiname
     */
    public void writeDocument(String output) {
        FileWriter fileWriter = null;
        SimpleDateFormat formatter = new SimpleDateFormat ("dd.MM.yyyy");
        Date currentTime = new Date();
        
        try {
            File file = new File(output);
            fileWriter = new FileWriter(file);
            
            fileWriter.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" + newLine);
            fileWriter.write("<!DOCTYPE Katalog SYSTEM \"Katalog.dtd\">" + newLine);
            fileWriter.write("<Katalog>" + newLine);
            
            fileWriter.write("  <BuchBestand>" + newLine);
            writeBook(fileWriter);
            fileWriter.write("      <MetaDaten anzahlEintraege=\"" + books.size() + "\" letzeAenderung=\"" + formatter.format(currentTime) + "\"></MetaDaten>" + newLine);
            fileWriter.write("  </BuchBestand>" + newLine);
            
            fileWriter.write("  <DVDBestand>" + newLine);
            writeDVD(fileWriter);
            fileWriter.write("      <MetaDaten anzahlEintraege=\"" + dvds.size() + "\" letzeAenderung=\"" + formatter.format(currentTime) + "\"></MetaDaten>" + newLine);
            fileWriter.write("  </DVDBestand>" + newLine);
            
            fileWriter.write("  <TontraegerBestand>" + newLine);
            writeSoundStorage(fileWriter);
            fileWriter.write("      <MetaDaten anzahlEintraege=\"" + storages.size() + "\" letzeAenderung=\"" + formatter.format(currentTime) + "\"></MetaDaten>" + newLine);
            fileWriter.write("  </TontraegerBestand>" + newLine);
            
            fileWriter.write("  <eBookBestand>" + newLine);
            writeEBook(fileWriter);
            fileWriter.write("      <MetaDaten anzahlEintraege=\"" + eBooks.size() + "\" letzeAenderung=\"" + formatter.format(currentTime) + "\"></MetaDaten>" + newLine);
            fileWriter.write("  </eBookBestand>" + newLine);
            
            fileWriter.write("  <MetaDaten anzahlEintraege =\""+ (books.size() + dvds.size() + storages.size() + eBooks.size()) + "\" letzeAenderung=\"" + formatter.format(currentTime) + "\"></MetaDaten>" + newLine);
            
            fileWriter.write("</Katalog>");
        } catch (IOException ex) {
            Logger.getLogger(XMLWriter.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                fileWriter.close();
            } catch (IOException ex) {
                Logger.getLogger(XMLWriter.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    /**
     * Schreibt alle Buchdaten und Buecher in der vorgegebenen XML Struktur in die Datei.
     * 
     * @param fileWriter Objekt zum Beschreiben der Datei
     * @throws IOException Ein-/Ausgabe Exception
     */
    private void writeBook(FileWriter fileWriter) throws IOException {
        for(int i = 0; i < books.size(); i++) {
            fileWriter.write("      <Buch>" + newLine);
            
            //Titel
            if(books.get(i).getTitle().isEmpty())
                fileWriter.write("          <Titel unbekannt=\"1\">" + "</Titel>" + newLine);
            else
                fileWriter.write("          <Titel unbekannt=\"0\">" + books.get(i).getTitle() + "</Titel>" + newLine);
            
            //Verlag
            if(books.get(i).getPublisher().isEmpty())
                fileWriter.write("          <Verlag unbekannt=\"1\">" + "</Verlag>" + newLine);
            else
                fileWriter.write("          <Verlag unbekannt=\"0\">" + books.get(i).getPublisher() + "</Verlag>" + newLine);
            
            //Autoren
            if(books.get(i).getAuthorCount() == 0) {
                fileWriter.write("          <Autor unbekannt=\"1\">" + "</Autor>" + newLine);
            } else {
                for(int j = 0; j < books.get(i).getAuthorCount(); j++) {
                    fileWriter.write("          <Autor unbekannt=\"0\">" + books.get(i).getAuthorByIndex(j) + "</Autor>" + newLine);
                }
            }
            
            //EAN
            if(books.get(i).getEan().isEmpty())
                fileWriter.write("          <EAN unbekannt=\"1\">" + "</EAN>" + newLine);
            else
                fileWriter.write("          <EAN unbekannt=\"0\">" + books.get(i).getEan() + "</EAN>" + newLine);
            
            //ISBN
            if(books.get(i).getIsbn().isEmpty())
                fileWriter.write("          <ISBN unbekannt=\"1\">" + "</ISBN>" + newLine);
            else
                fileWriter.write("          <ISBN unbekannt=\"0\">" + books.get(i).getIsbn() + "</ISBN>" + newLine);
            
            //Veroeffentlicht
            if(books.get(i).getPublished().isEmpty())
                fileWriter.write("          <Veroeffentlicht unbekannt=\"1\">" + "</Veroeffentlicht>" + newLine);
            else
                fileWriter.write("          <Veroeffentlicht unbekannt=\"0\">" + books.get(i).getPublished() + "</Veroeffentlicht>" + newLine);
            
            //Bindung
            if(!books.get(i).getBinding().isEmpty())
                fileWriter.write("          <Bindung>" + books.get(i).getBinding() + "</Bindung>" + newLine);
            
            //Edition
            if(!books.get(i).getEdition().isEmpty())
                fileWriter.write("          <Edition>" + books.get(i).getEdition() + "</Edition>" + newLine);
            
            //Seiten
            if(!books.get(i).getPages().isEmpty())
                fileWriter.write("          <SeitenAnzahl>" + books.get(i).getPages() + "</SeitenAnzahl>" + newLine);
            
            fileWriter.write("      </Buch>" + newLine);
        }
    }
    
    /**
     * Schreibt alle DVDdaten und DVDs in der vorgegebenen XML Struktur in die Datei.
     * 
     * @param fileWriter Objekt zum Beschreiben der Datei
     * @throws IOException Ein-/Ausgabe Exception
     */
    private void writeDVD(FileWriter fileWriter) throws IOException {
        for(int i = 0; i < dvds.size(); i++) {
            fileWriter.write("      <DVD>" + newLine);
            
            //Titel
            if(dvds.get(i).getTitle().isEmpty())
                fileWriter.write("          <Titel unbekannt=\"1\">" + "</Titel>" + newLine);
            else
                fileWriter.write("          <Titel unbekannt=\"0\">" + dvds.get(i).getTitle() + "</Titel>" + newLine);
            
            //Studio
            if(dvds.get(i).getStudio().isEmpty())
                fileWriter.write("          <Studio unbekannt=\"1\">" + "</Studio>" + newLine);
            else
                fileWriter.write("          <Studio unbekannt=\"0\">" + dvds.get(i).getStudio() + "</Studio>" + newLine);
            
            //Regisseur
            if(dvds.get(i).getDirectorCount() == 0) {
                fileWriter.write("          <Regisseur unbekannt=\"1\">" + "</Regisseur>" + newLine);
            } else {
                for(int j = 0; j < dvds.get(i).getDirectorCount(); j++) {
                    fileWriter.write("          <Regisseur unbekannt=\"0\">" + dvds.get(i).getDirectorByIndex(j) + "</Regisseur>" + newLine);
                }
            }
            
            //Schauspieler
            if(dvds.get(i).getActorCount() == 0) {
                fileWriter.write("          <Schauspieler unbekannt=\"1\">" + "</Schauspieler>" + newLine);
            } else {
                for(int j = 0; j < dvds.get(i).getActorCount(); j++) {
                    fileWriter.write("          <Schauspieler unbekannt=\"0\">" + dvds.get(i).getActorByIndex(j) + "</Schauspieler>" + newLine);
                }
            }
            
            //EAN
            if(dvds.get(i).getEan().isEmpty())
                fileWriter.write("          <EAN unbekannt=\"1\">" + "</EAN>" + newLine);
            else
                fileWriter.write("          <EAN unbekannt=\"0\">" + dvds.get(i).getEan() + "</EAN>" + newLine);
            
            //Veroeffentlicht
            if(dvds.get(i).getPublished().isEmpty())
                fileWriter.write("          <Veroeffentlicht unbekannt=\"1\">" + "</Veroeffentlicht>" + newLine);
            else
                fileWriter.write("          <Veroeffentlicht unbekannt=\"0\">" + dvds.get(i).getPublished() + "</Veroeffentlicht>" + newLine);
            
            //Format
            for(int j = 0; j < dvds.get(i).getFormatCount(); j++) {
                fileWriter.write("          <Format>" + dvds.get(i).getFormatByIndex(j) + "</Format>" + newLine);
            }
            
            //Laufzeit
            if(!dvds.get(i).getDuration().isEmpty())
                fileWriter.write("          <Laufzeit>" + dvds.get(i).getDuration() + "</Laufzeit>" + newLine);
            
            //Dimension
            if(!dvds.get(i).getDimension().isEmpty())
                fileWriter.write("          <Dimension>" + dvds.get(i).getDimension() + "</Dimension>" + newLine);
            
            fileWriter.write("      </DVD>" + newLine);
        }
    }
    
    /**
     * Schreibt alle Tontraegerdaten und Tontraeger in der vorgegebenen XML Struktur in die Datei.
     * 
     * @param fileWriter Objekt zum Beschreiben der Datei
     * @throws IOException Ein-/Ausgabe Exception
     */
    private void writeSoundStorage(FileWriter fileWriter) throws IOException {
        for(int i = 0; i < storages.size(); i++) {
            fileWriter.write("      <Tontraeger>" + newLine);
            
            //Titel
            if(storages.get(i).getTitle().isEmpty())
                fileWriter.write("          <Titel unbekannt=\"1\">" + "</Titel>" + newLine);
            else
                fileWriter.write("          <Titel unbekannt=\"0\">" + storages.get(i).getTitle() + "</Titel>" + newLine);
            
            //Label
            if(storages.get(i).getLabel().isEmpty())
                fileWriter.write("          <Label unbekannt=\"1\">" + "</Label>" + newLine);
            else
                fileWriter.write("          <Label unbekannt=\"0\">" + storages.get(i).getLabel() + "</Label>" + newLine);
            
            //Interpreten
            if(storages.get(i).getInterpreterCount() == 0) {
                fileWriter.write("          <Interpret unbekannt=\"1\">" + "</Interpret>" + newLine);
            } else {
                for(int j = 0; j < storages.get(i).getInterpreterCount(); j++) {
                    fileWriter.write("          <Interpret unbekannt=\"0\">" + storages.get(i).getInterpreterByIndex(j) + "</Interpret>" + newLine);
                }
            }
            
            //EAN
            if(storages.get(i).getEan().isEmpty())
                fileWriter.write("          <EAN unbekannt=\"1\">" + "</EAN>" + newLine);
            else
                fileWriter.write("          <EAN unbekannt=\"0\">" + storages.get(i).getEan() + "</EAN>" + newLine);
            
            //Veroeffentlicht
            if(storages.get(i).getPublished().isEmpty())
                fileWriter.write("          <Veroeffentlicht unbekannt=\"1\">" + "</Veroeffentlicht>" + newLine);
            else
                fileWriter.write("          <Veroeffentlicht unbekannt=\"0\">" + storages.get(i).getPublished() + "</Veroeffentlicht>" + newLine);
            
            //TontraegerArt
            if(!storages.get(i).getType().isEmpty())
                fileWriter.write("          <TontraegerArt>" + storages.get(i).getType() + "</TontraegerArt>" + newLine);
            
            //TontraegerAnzahl
            if(!storages.get(i).getAmount().isEmpty())
                fileWriter.write("          <TontraegerAnzahl>" + storages.get(i).getAmount() + "</TontraegerAnzahl>" + newLine);
            
            fileWriter.write("      </Tontraeger>" + newLine);
        }
    }
    
    /**
     * Schreibt alle eBookDaten und eBooks in der vorgegebenen XML Struktur in die Datei.
     * 
     * @param fileWriter Objekt zum Beschreiben der Datei
     * @throws IOException Ein-/Ausgabe Exception
     */
    private void writeEBook(FileWriter fileWriter) throws IOException {
        for(int i = 0; i < eBooks.size(); i++) {
            fileWriter.write("      <eBook>" + newLine);
            
            //Titel
            if(eBooks.get(i).getTitleCount() == 0) {
                fileWriter.write("          <Titel unbekannt=\"1\">" + "</Titel>" + newLine);
            } else {
                for(int j = 0; j < eBooks.get(i).getTitleCount(); j++) {
                    fileWriter.write("          <Titel unbekannt=\"0\">" + eBooks.get(i).getTitleByIndex(j) + "</Titel>" + newLine);
                }
            }
            
            //Verlag
            if(eBooks.get(i).getPublisher().isEmpty())
                fileWriter.write("          <Verlag unbekannt=\"1\">" + "</Verlag>" + newLine);
            else
                fileWriter.write("          <Verlag unbekannt=\"0\">" + eBooks.get(i).getPublisher() + "</Verlag>" + newLine);
            
            //Autoren
            if(eBooks.get(i).getAuthorCount() == 0) {
                fileWriter.write("          <Autor unbekannt=\"1\">" + "</Autor>" + newLine);
            } else {
                for(int j = 0; j < eBooks.get(i).getAuthorCount(); j++) {
                    fileWriter.write("          <Autor unbekannt=\"0\">" + eBooks.get(i).getAuthorByIndex(j) + "</Autor>" + newLine);
                }
            }
            
            //Langer Titel
            if(eBooks.get(i).getLongTitle().isEmpty())
                fileWriter.write("          <LangerTitel unbekannt=\"1\">" + "</LangerTitel>" + newLine);
            else
                fileWriter.write("          <LangerTitel unbekannt=\"0\">" + eBooks.get(i).getLongTitle() + "</LangerTitel>" + newLine);
            
            //Veroeffentlicht
            if(eBooks.get(i).getPublished().isEmpty())
                fileWriter.write("          <Veroeffentlicht unbekannt=\"1\">" + "</Veroeffentlicht>" + newLine);
            else
                fileWriter.write("          <Veroeffentlicht unbekannt=\"0\">" + eBooks.get(i).getPublished() + "</Veroeffentlicht>" + newLine);
            
            //Sprache
            if(!eBooks.get(i).getLanguage().isEmpty())
                fileWriter.write("          <Sprache>" + eBooks.get(i).getLanguage() + "</Sprache>" + newLine);
            
            //Inhalt
            for(int j = 0; j < eBooks.get(i).getContentCount(); j++) {
                fileWriter.write("          <Inhalt>" + eBooks.get(i).getContentByIndex(j) + "</Inhalt>" + newLine);
            }
            
            fileWriter.write("      </eBook>" + newLine);
        }
    }
}
